﻿#define _CRT_SECURE_NO_WARNING 1

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//写一个函数，求两个整数之和，要求在函数体内不得使用 + 、 - 、 * 、 / 四则运算符号。
//
//数据范围：两个数都满足
//−10≤n≤1000
//进阶：空间复杂度O(1)，时间复杂度O(1)

int Add(int num1, int num2)
{
    while (num2 != 0)
    {
        int carry = (num1 & num2) << 1;//&可以求出两数相加后的进位信息，我们把它向左移动一位就会是相加后的进位所在
        num1 = num1 ^ num2;//^操作获得相加后的非进位值
        num2 = carry;//我们只要重复的把非进位值与进位值相加，直到没有新的进位值之后，得到的就是最后的和
    }
    return num1;
}



//给你一个含 n 个整数的数组 nums ，其中 nums[i] 在区间[1, n] 内。请你找出所有在[1, n] 范围内但没有出现在 nums 中的数字，并以数组的形式返回结果。

int cmp(const void* x, const void* y)
{
    return *(int*)x - *(int*)y;
}

int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * 100000);
    int count = 0, j = 0;
    qsort(nums, numsSize, sizeof(int), cmp);
    for (int i = 1; i <= numsSize; )
    {
        if (j == numsSize && i <= numsSize)//特殊情况当j已经遍历完，可是1到n却没遍历完，直接把剩下到n的数全部记到数组arr里
        {
            arr[count++] = i++;
            continue;//通过contnue结束本次循环，开始下次循环
        }
        if (i > nums[j])
        {
            j++;
            continue;
        }
        else if (i < nums[j])
        {
            arr[count++] = i++;
        }
        else
        {
            j++; 
            i++;
        }
    }
    *returnSize = count;
    arr = (int*)realloc(arr, sizeof(int) * count);
    return arr;
}


//int main()
//{
//    int i = 1;
//    sizeof(i++);//sizeof不会改变变量的值
//    printf("%d\n", i);//1
//    return 0;
//}


//给定一个二进制数组 nums ， 计算其中最大连续 1 的个数

int findMaxConsecutiveOnes(int* nums, int numsSize)
{
    int count = 0, max = 0;
    for (int i = 0; i < numsSize; i++)
    {
        if (nums[i] != 1)
        {
            count = 0;
        }
        else
        {
            count++;
            if (count > max)
            {
                max = count;
            }
        }
    }
    return max;
}

//完全数（Perfect number），又称完美数或完备数，是一些特殊的自然数。
//它所有的真因子（即除了自身以外的约数）的和（即因子函数），恰好等于它本身。
//例如：28，它有约数1、2、4、7、14、28，除去它本身28外，其余5个数相加，1 + 2 + 4 + 7 + 14 = 28。
//输入n，请输出n以内(含n)完全数的个数。
//输入描述：
//输入一个数字n
//输出描述：
//输出不超过n的完全数的个数

int isPerfectNumber(int num) 
{
    int sum = 1;

    for (int i = 2; i * i <= num; i++)//i*i<=num使计算量减少到一半
    {
        if (num % i == 0) 
        {
            sum += i;//说明这个是约数之一
            if (i != num / i) 
            {
                sum += num / i;//判断两个约数不相等之后求出对应的的约数并相加起来
            }
        }
    }

    return sum == num;//返回是否相等的值，相等返回真。
}

int main()
{
    int count = 0;
    int n;
    scanf("%d", &n);

    for (int i = 2; i <= n; i++)
    {
        if (isPerfectNumber(i)) 
        {
            count++;
        }
    }
    printf("%d", count);
    return 0;
}